package com.yixing.tech.wcs.service;

import com.yixing.tech.common.base.BusinessException;
import com.yixing.tech.common.autoline.domain.AGVRasterRequest;
import com.yixing.tech.common.entity.WCSTaskCallbackVO;
import com.yixing.tech.common.entity.wcs.TaskVO;
import com.yixing.tech.common.entity.wcs.WCSTaskRequest;
import com.yixing.tech.wcs.domain.po.SubTask;
import com.yixing.tech.wcs.domain.vo.RCSTaskRequestVO;
import com.yixing.tech.wcs.domain.vo.SubTaskVO;

import java.util.List;

/**
 * 任务处理服务接口
 * 负责处理WMS下发的任务，包括任务分解、资源分配、任务执行等核心业务逻辑
 */
public interface ITaskService {

    /**
     * 生成任务
     * @param taskVO 任务数据对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object genTask(TaskVO taskVO) throws BusinessException;

    /**
     * 取消任务
     * @param taskVO 任务数据对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object cancelTask(TaskVO taskVO) throws BusinessException;

    /**
     * 取消子任务
     * @param subTaskVO 子任务数据对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object cancelSubTask(SubTaskVO subTaskVO) throws BusinessException;

    /**
     * 分解任务
     * 将WMS下发的主任务分解为一个或多个子任务
     * @param taskVO 任务数据对象
     * @throws BusinessException 业务异常
     */
    void decomposeTask(TaskVO taskVO) throws BusinessException;

    /**
     * 根据任务编码分解任务
     * @param taskCode 任务编码
     * @throws BusinessException 业务异常
     */
    void decomposeTaskWithTaskCode(String taskCode) throws BusinessException;

    /**
     * 自动分解未分解的任务
     * 查询并分解所有未分解的主任务
     * @return 分解的任务列表
     * @throws BusinessException 业务异常
     */
    Object decomposeTask() throws BusinessException;

    /**
     * 为子任务分配资源
     * 分配子任务执行所需的库位等资源
     * @throws BusinessException 业务异常
     */
    void allocateResourceForSubTask() throws BusinessException;

    /**
     * 启动子任务
     * 将已分配资源的子任务下发给相应硬件设备执行
     * @throws BusinessException 业务异常
     */
    void startUpSubTask() throws BusinessException;

    /**
     * 执行子任务
     * 根据子任务配置和机器人类型执行具体任务
     * @param subTask 子任务对象
     * @throws BusinessException 业务异常
     */
    void executeSubTask(SubTask subTask) throws BusinessException;

    /**
     * 执行下一个子任务
     * 在当前子任务完成后，执行链式任务的下一个任务
     * @param subTaskCode 子任务编码
     * @throws BusinessException 业务异常
     */
    void executeNextSubTask(String subTaskCode) throws BusinessException;

    /**
     * 通知任务执行结果
     * 向上层系统反馈任务执行状态和结果
     * @param subTaskCode 子任务编码
     * @param action 操作类型（如finish、outbin等）
     * @throws BusinessException 业务异常
     */
    void notifyTaskExecResult(String subTaskCode, String action) throws BusinessException;

    /**
     * 通知上层业务服务发生了移库动作
     * 在移库任务完成后通知上层系统
     * @param subTaskCode 子任务编码
     * @param action 操作类型
     * @throws BusinessException 业务异常
     */
    void notifyMovingTaskAction(String subTaskCode, String action) throws BusinessException;

    /**
     * 更新任务状态
     * 根据操作类型更新任务状态
     * @param taskCode 任务编码
     * @param action 操作类型（finish等）
     * @throws BusinessException 业务异常
     */
    void updateTaskStatus(String taskCode, String action) throws BusinessException;

    /**
     * 更新任务资源
     * 任务完成后释放占用的资源
     * @param subTaskCode 子任务编码
     * @param action 操作类型
     * @throws BusinessException 业务异常
     */
    void updateTaskResource(String subTaskCode, String action) throws BusinessException;

    /**
     * 继续执行任务
     * 尝试为中间任务获取资源，以执行中间任务
     * 处理有依赖关系的任务链
     * @throws BusinessException 业务异常
     */
    void continuePerformTask() throws BusinessException;

    /**
     * 生成WCS任务
     * 直接向WCS系统下发任务
     * @param request 任务请求对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object genWCSTask(WCSTaskRequest request) throws BusinessException;

    /**
     * 批量生成WCS任务
     * 批量向WCS系统下发多个任务
     * @param list 任务请求对象列表
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object genWCSTaskMulti(List<WCSTaskRequest> list) throws BusinessException;

    /**
     * 生成CTU搬运任务
     * 为CTU（穿梭车）生成搬运任务
     * @param taskVO 任务数据对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object genCTUTransportTask(TaskVO taskVO) throws BusinessException;

    /**
     * 生成CTU出库任务
     * 为CTU生成出库任务
     * @param request 任务请求对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object genCTUOutboundTask(RCSTaskRequestVO request) throws BusinessException;

    /**
     * 生成CTU入库任务
     * 为CTU生成入库任务
     * @param request 任务请求对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object genCTUInboundTask(RCSTaskRequestVO request) throws BusinessException;

    /**
     * 料箱通行申请
     * 申请料箱通过特定区域的权限
     * @param requestVO 请求对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object boxApplyPass(RCSTaskRequestVO requestVO) throws BusinessException;

    /**
     * 请求打开光栅
     * 控制AGV车辆通行光栅的开启
     * @param request 光栅请求对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object requestOpenRaster(AGVRasterRequest request) throws BusinessException;

    /**
     * 请求关闭光栅
     * 控制AGV车辆通行光栅的关闭
     * @param request 光栅请求对象
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Object requestCloseRaster(AGVRasterRequest request) throws BusinessException;

    /**
     * 释放资源
     * 任务完成后释放占用的设备和库位资源
     * @param callbackVO 回调数据对象
     * @throws BusinessException 业务异常
     */
    void releaseResource(WCSTaskCallbackVO callbackVO) throws BusinessException;

    /**
     * 检查是否存在正在执行的CTU出库任务
     * @param data 数据参数
     * @return 是否存在正在执行的CTU出库任务
     */
    boolean existRunningOutBoundTaskForCTU(Object data);
}
